﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using TccServicos.Models;
using TccServicos.Util;

namespace TccServicos.Controllers
{
    public class PessoaFiltroController : ApiController
    {
        #region Atributos
        private string sThread = "";
        #endregion

        #region WebApis do TCC Pessoa Filtro
        [HttpPost]
        public RetornoServico SavePessoaFiltro(PessoaFiltro objeto)
        {
            sThread = Util.Util.NextHex(4);
            string nomeFuncao = string.Format("{0} [{1}]", "SavePessoaFiltro", sThread);

            try
            {
                if (!Validacao.ObjetoValido(objeto))
                {
                    Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.objetoInvalido));
                }

                string jsonEntrada = JsonConvert.SerializeObject(objeto, new JsonSerializerSettings()
                {
                    NullValueHandling = NullValueHandling.Ignore
                });

                Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, jsonEntrada));

                using (adoteEntities contexto = new adoteEntities())
                {
                    var objetoSalvar = new CADASTRO_PESSOA_FILTRO
                    {
                        ID_FILTRO = objeto.idPessoaFiltro,
                        ID_CADASTRO_PESSOA = objeto.pessoa.idPessoa,
                        ID_GENERO = (Validacao.ObjetoValido(objeto.genero) ? objeto.genero.idGenero : (int?)null),
                        ID_RACA = (Validacao.ObjetoValido(objeto.raca) ? objeto.raca.idRaca : (int?)null),
                        ID_PORTE = (Validacao.ObjetoValido(objeto.porte) ? objeto.porte.idPorte : (int?)null),
                        IDADE_MIN = objeto.idadeMin,
                        IDADE_MAX = objeto.idadeMax,
                        PESO_MIN = objeto.pesoMin,
                        PESO_MAX = objeto.pesoMax,
                        ID_UF = objeto.idUf == 0 ? (int?)null : objeto.idUf,
                        ID_CIDADE = objeto.idCidade == 0 ? (int?)null : objeto.idCidade,
                        ANIMAL_TIPO = objeto.animalTipo,
                    };
                    if (objetoSalvar.ID_GENERO.HasValue && objetoSalvar.ID_GENERO.Value == 0)
                        objetoSalvar.ID_GENERO = null;
                    if (objetoSalvar.ID_RACA.HasValue && objetoSalvar.ID_RACA.Value == 0)
                        objetoSalvar.ID_RACA = null;
                    if (objetoSalvar.ID_PORTE.HasValue && objetoSalvar.ID_PORTE.Value == 0)
                        objetoSalvar.ID_PORTE = null;

                    //Verifica se já existe
                    var consulta = (from t in contexto.CADASTRO_PESSOA_FILTRO
                                    where t.ID_CADASTRO_PESSOA == objeto.pessoa.idPessoa
                                    select t).AsQueryable();
                    if (objetoSalvar.ID_GENERO != null && objetoSalvar.ID_GENERO.HasValue)
                        consulta = consulta.Where(x => x.ID_GENERO == objetoSalvar.ID_GENERO.Value);
                    if (objetoSalvar.ID_RACA != null && objetoSalvar.ID_RACA.HasValue)
                        consulta = consulta.Where(x => x.ID_RACA == objetoSalvar.ID_RACA.Value);
                    if (objetoSalvar.ID_PORTE != null && objetoSalvar.ID_PORTE.HasValue)
                        consulta = consulta.Where(x => x.ID_PORTE == objetoSalvar.ID_PORTE.Value);
                    if (objetoSalvar.IDADE_MIN != null && objetoSalvar.IDADE_MIN.HasValue)
                        consulta = consulta.Where(x => x.IDADE_MIN == objetoSalvar.IDADE_MIN.Value);
                    if (objetoSalvar.IDADE_MAX != null && objetoSalvar.IDADE_MAX.HasValue)
                        consulta = consulta.Where(x => x.IDADE_MAX == objetoSalvar.IDADE_MAX.Value);
                    if (objetoSalvar.PESO_MIN != null && objetoSalvar.PESO_MIN.HasValue)
                        consulta = consulta.Where(x => x.PESO_MIN == objetoSalvar.PESO_MIN.Value);
                    if (objetoSalvar.PESO_MAX != null && objetoSalvar.PESO_MAX.HasValue)
                        consulta = consulta.Where(x => x.PESO_MAX == objetoSalvar.PESO_MAX.Value);
                    if (objetoSalvar.ID_UF != null && objetoSalvar.ID_UF.HasValue)
                        consulta = consulta.Where(x => x.ID_UF == objetoSalvar.ID_UF.Value);
                    if (objetoSalvar.ID_CIDADE != null && objetoSalvar.ID_CIDADE.HasValue)
                        consulta = consulta.Where(x => x.ID_CIDADE == objetoSalvar.ID_CIDADE.Value);
                    consulta = consulta.Where(x => x.ANIMAL_TIPO == objetoSalvar.ANIMAL_TIPO);
                    
                    int existe = 0;
                    if (!objeto.excluir)
                        existe = consulta.Select(x => x.ID_FILTRO).FirstOrDefault();

                    if (existe > 0)
                    {
                        Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.salvoComSucesso));
                        return Util.Util.RetornoOk();
                    }
                    else
                    {
                        if (objeto.excluir)
                        {
                            contexto.CADASTRO_PESSOA_FILTRO.Attach(objetoSalvar);
                            contexto.Entry(objetoSalvar).State = System.Data.EntityState.Deleted;
                            contexto.SaveChanges();
                        }
                        else if (objeto.idPessoaFiltro > 0)
                        {
                            contexto.CADASTRO_PESSOA_FILTRO.Attach(objetoSalvar);
                            contexto.Entry(objetoSalvar).State = System.Data.EntityState.Modified;
                            contexto.SaveChanges();
                        }
                        else
                        {
                            contexto.CADASTRO_PESSOA_FILTRO.Add(objetoSalvar);
                            contexto.SaveChanges();
                        }
                        Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.salvoComSucesso));
                        return Util.Util.RetornoOk(objetoSalvar.ID_FILTRO);
                    }
                }
            }
            catch (Exception ex)
            {
                Log.GravarLog(string.Format("{0} Erro: {1}", nomeFuncao, ex.ToString()));
                return Util.Util.RetornoErro(ex.ToString());
            }
        }

        [HttpGet]
        public RetornoFiltros GetPessoaFiltro([FromUri] int? idPessoa = null, [FromUri] int? idFiltro = null)
        {
            sThread = Util.Util.NextHex(4);
            string nomeFuncao = string.Format("{0} [{1}]", "GetPessoaFiltro", sThread);

            try
            {
                Log.GravarLog(string.Format("{0}: id={1}", nomeFuncao, idPessoa.HasValue ? idPessoa.Value.ToString() : "0"));

                using (adoteEntities contexto = new adoteEntities())
                {
                    var consulta = (from t in contexto.CADASTRO_PESSOA_FILTRO.AsNoTracking()
                                    join p in contexto.CADASTRO_PESSOA.AsNoTracking() on t.ID_CADASTRO_PESSOA equals p.ID_CADASTRO_PESSOA
                                    join g in contexto.CADASTRO_GENERO.AsNoTracking() on t.ID_GENERO equals g.ID_GENERO
                                    into gt from g in gt.DefaultIfEmpty()
                                    join r in contexto.CADASTRO_RACA.AsNoTracking() on t.ID_RACA equals r.ID_RACA
                                    into rt from r in rt.DefaultIfEmpty()
                                    join po in contexto.CADASTRO_PORTE.AsNoTracking() on t.ID_PORTE equals po.ID_PORTE
                                    into pot from po in pot.DefaultIfEmpty()
                                    select new PessoaFiltro
                                    {
                                        idPessoaFiltro = t.ID_FILTRO,
                                        pessoa = new Pessoa()
                                        {
                                            idPessoa = p.ID_CADASTRO_PESSOA,
                                            nome = p.NOME,
                                        },
                                        genero = new Genero()
                                        {
                                            idGenero = g != null ? g.ID_GENERO : 0,
                                            genero = g!= null ? g.GENERO : null,
                                        },
                                        raca = new Raca()
                                        {
                                            idRaca = r!= null ? r.ID_RACA : 0,
                                            raca = r != null ? r.RACA : null,
                                        },
                                        porte = new Porte()
                                        {
                                            idPorte = po != null ? po.ID_PORTE : 0,
                                            porte = po != null ? po.PORTE : null,
                                        },
                                        idadeMin = t.IDADE_MIN,
                                        idadeMax = t.IDADE_MAX,
                                        pesoMin = t.PESO_MIN,
                                        pesoMax = t.PESO_MAX,
                                        idUf = t.ID_UF.HasValue ? t.ID_UF.Value : 0,
                                        idCidade = t.ID_CIDADE.HasValue ? t.ID_CIDADE.Value : 0,
                                        animalTipo = t.ANIMAL_TIPO.HasValue ? t.ANIMAL_TIPO.Value : 0,
                                    });
                    if (idPessoa.HasValue)
                        consulta = consulta.Where(x => x.pessoa.idPessoa.Equals(idPessoa.Value));
                    if (idFiltro.HasValue)
                        consulta = consulta.Where(x => x.idPessoaFiltro.Equals(idFiltro.Value));
                    consulta = consulta.OrderBy(x => x.idPessoaFiltro);

                    var retorno = consulta.ToList();

                    Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.consultaComSucesso));

                    return new RetornoFiltros() { lista = retorno };
                }
            }
            catch (Exception ex)
            {
                Log.GravarLog(string.Format("{0} Erro: {1}", nomeFuncao, ex.ToString()));
                return default(RetornoFiltros);
            }
        }
        #endregion

    }
}